Spring Cloud Bus 通过轻量级消息代理连接各个微服务,可用广播配置文件来更改/或管理服务监控。
首先安装 RabbitMQ,Docker 中 RabbitMQ 安装命令:
docker run -d --hostname my-rabbit --name some-rabbit -P 15672:15672 5672:5672 rabbitmq:3-management |
详细安装步骤可参考 Docker一键安装RabbitMQ 这篇文章。
1. 实现配置文件的动态刷新(全部刷新)。
在上篇文章当我们的配置文件发生变化时,我们需要挨个的向 config-client 发送 include refresh 这个请求,然才能实现 config-client 配置文件的动态刷新。显然比较麻烦。
结合 Spring Cloud Bus 之后,当我们的配置文件发生变化时, 我们可以只向 config-server 发送一个更新请求,然后 config-server 把消息发送给 Spring Cloud Bus ,Spring Cloud Bus 收到消息后把消息转发到 RabbitMQ ,RabbitMQ 就可以通知 config-client ,config-client 收到消息后就会自动更新。(总之就是开发者只需给 config-server 发送一次消息就可以了,剩下 config-client 都会自动刷新。)
RabbitMQ安装完成后,结合上篇文章在 config-server 和 config-client 分别添加如下依赖:
<dependency> |
同时 config-server 将提供刷新接口,所以 config-server 还需添加如下依赖:
<dependency> |
然后,给两个分别配置,使之都能连接到 RabbitMQ 上。
spring.rabbitmq.host=192.168.1.132 |
在 config-server 中,添加开启 bus-refresh 端点:
management.endpoints.web.exposure.include=bus-refresh |
由于给 config-server 中的所有接口都添加了保护,所以刷新接口都无法直接访问,这时可通过修改 Security 配置,对端点的权限作出修改:
|
在这段配置中,开启了 HttpBasic 登录,这样在刷新请求时,就可以直接通过 HttpBasic 配置认证信息了。
最后分别启动 Eureka、 config-server 和 config-client ,访问:http://localhost:8082/hello 如下:
然后修改配置信息提交到 GitHub (此处将test123改为 test),刷新 config-client 接口,查看是否有变化 (此时没变化)。
然后用 postman 测试发送 POST 请求: http://localhost:8081/actuator/bus-refresh ,请求结果是空白则成功。如下图:
这个 post 是针对 config-server 的,config-server 会把这个刷新的指令传到 rabbitMQ,然后 rabbitmq 再把指令传给各个 client。然后继续访问: http://localhost:8082/hello 如下: 发现结果已经改变。(此处只要在 client 端配置了 rabbitmq,就会自动修改)。
2. 逐个刷新
如果更新完配置文件之后,不希望每一个微服务都去刷新配置文件,那么可以通过如下配置解决问题。
首先,给每个 config-client 配置文件添加一个 instance-id:
eureka.instance.instance-id=${spring.application.name}:${server.port} |
然后,对 config-client 进行打包。
打包完成后,在IDEA 的Terminal 框通过如下命令启动两个 config-client 实例:
java -jar config-client-0.0.1-SNAPSHOT.jar --server.port=8082 |
启动成功后,在浏览器分别访问8082端口和8083端口的,访问结果相同。如下:
接下来修改本地文件(将 test 改为 test234),并提交至 GitHub,如下:
1. 测试批量全部刷新
提交后,我们继续 post 请求 config-server ,访问 http://localhost:8081/actuator/bus-refresh 如下:
请求成功后,继续访问刚才那两个接口,都已经发生了改变。如下:
2. 测试逐个刷新
继续修改本地文件(将 test234 改为 test888),并提交至 GitHub,如下:
提交成功后可通过如下方式只刷新某一个微服务,例如只刷新 8082 端口的服务。
client1:8082 表示是服务instance-id。
http://localhost:8081/actuator/bus-refresh/client1:8082 |
此时再访问原来那两个接口,结果如下,只有 8082 端口发生了变化,8083 没有改变。